import Singleton from '../Base/Singleton'

interface IItem {
  ctx: unknown // this
  func: Function
}

/**
 * 单例模式
 * 按钮事件
 */
export default class EventManager extends Singleton {
  static get Instance() {
    return super.GetInstance<EventManager>()
  }
  // 使用key->Array<func>的结构存储事件
  private eventDic: Map<string, Array<IItem>> = new Map()

  // 添加绑定事件
  on(eventName: string, func: Function, ctx?: unknown) {
    if (this.eventDic.has(eventName)) {
      this.eventDic.get(eventName).push({ func, ctx })
    } else {
      this.eventDic.set(eventName, [{ func, ctx }])
    }
  }

  // 解绑事件
  off(eventName: string, func: Function) {
    if (this.eventDic.has(eventName)) {
      const index = this.eventDic.get(eventName).findIndex(i => i.func === func)
      index > -1 && this.eventDic.get(eventName).splice(index, 1)
    }
  }

  // 调用事件
  emit(eventName: string, ...params: unknown[]) {
    if (this.eventDic.has(eventName)) {
      this.eventDic.get(eventName).forEach((i: IItem) => {
        if (i.ctx) {
          i.func.apply(i.ctx, params)
        } else {
          i.func(...params)
        }
      })
    }
  }

  // 清除事件
  clear() {
    this.eventDic.clear()
  }
}
